gskvulkanimageprivate.h \
gskvulkanmemoryprivate.h \
gskvulkanpipelineprivate.h \
+ gskvulkanpushconstantsprivate.h \
gskvulkanrenderprivate.h \
gskvulkanrendererprivate.h \
gskvulkanrenderpassprivate.h \
gskvulkanimage.c \
gskvulkanmemory.c \
gskvulkanpipeline.c \
+ gskvulkanpushconstants.c \
gskvulkanrender.c \
gskvulkanrenderer.c \
gskvulkanrenderpass.c \
#include "gskvulkanpipelineprivate.h"
+#include "gskvulkanpushconstantsprivate.h"
#include "gskvulkanshaderprivate.h"
#include <graphene.h>
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
.setLayoutCount = 1,
.pSetLayouts = &self->descriptor_set_layout,
- .pushConstantRangeCount = 1,
- .pPushConstantRanges = (VkPushConstantRange[1]) {
- {
- .stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
- .offset = 0,
- .size = sizeof (graphene_matrix_t)
- }
- }
+ .pushConstantRangeCount = gst_vulkan_push_constants_get_range_count (),
+ .pPushConstantRanges = gst_vulkan_push_constants_get_ranges ()
},
NULL,
&self->pipeline_layout);
--- /dev/null
+#include "config.h"
+
+#include "gskvulkanpushconstantsprivate.h"
+
+#include <math.h>
+
+void
+gsk_vulkan_push_constants_init (GskVulkanPushConstants *constants,
+ const graphene_matrix_t *mvp)
+{
+ GdkRGBA transparent = { 0, 0, 0, 0 };
+
+ gsk_vulkan_push_constants_set_mvp (constants, mvp);
+ gsk_vulkan_push_constants_set_color (constants, &transparent);
+}
+
+void
+gsk_vulkan_push_constants_init_copy (GskVulkanPushConstants *self,
+ const GskVulkanPushConstants *src)
+{
+ *self = *src;
+}
+
+void
+gsk_vulkan_push_constants_set_mvp (GskVulkanPushConstants *self,
+ const graphene_matrix_t *mvp)
+{
+ graphene_matrix_to_float (mvp, self->vertex.mvp);
+}
+
+void
+gsk_vulkan_push_constants_multiply_mvp (GskVulkanPushConstants *self,
+ const graphene_matrix_t *transform)
+{
+ graphene_matrix_t old_mvp, new_mvp;
+
+ graphene_matrix_init_from_float (&old_mvp, self->vertex.mvp);
+ graphene_matrix_multiply (transform, &old_mvp, &new_mvp);
+ gsk_vulkan_push_constants_set_mvp (self, &new_mvp);
+}
+
+void
+gsk_vulkan_push_constants_set_color (GskVulkanPushConstants *self,
+ const GdkRGBA *color)
+{
+ self->fragment.color[0] = pow (color->red, 2.2);
+ self->fragment.color[1] = pow (color->green, 2.2);
+ self->fragment.color[2] = pow (color->blue, 2.2);
+ self->fragment.color[3] = color->alpha;
+}
+
+void
+gsk_vulkan_push_constants_push_vertex (GskVulkanPushConstants *self,
+ VkCommandBuffer command_buffer,
+ VkPipelineLayout pipeline_layout)
+{
+ vkCmdPushConstants (command_buffer,
+ pipeline_layout,
+ VK_SHADER_STAGE_VERTEX_BIT,
+ G_STRUCT_OFFSET (GskVulkanPushConstants, vertex),
+ sizeof (self->vertex),
+ &self->vertex);
+}
+
+void
+gsk_vulkan_push_constants_push_fragment (GskVulkanPushConstants *self,
+ VkCommandBuffer command_buffer,
+ VkPipelineLayout pipeline_layout)
+{
+ vkCmdPushConstants (command_buffer,
+ pipeline_layout,
+ VK_SHADER_STAGE_FRAGMENT_BIT,
+ G_STRUCT_OFFSET (GskVulkanPushConstants, fragment),
+ sizeof (self->fragment),
+ &self->fragment);
+}
+
+uint32_t
+gst_vulkan_push_constants_get_range_count (void)
+{
+ return 2;
+}
+
+const VkPushConstantRange *
+gst_vulkan_push_constants_get_ranges (void)
+{
+ static const VkPushConstantRange ranges[2] = {
+ {
+ .stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
+ .offset = G_STRUCT_OFFSET (GskVulkanPushConstants, vertex),
+ .size = sizeof (((GskVulkanPushConstants *) 0)->vertex)
+ },
+ {
+ .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
+ .offset = G_STRUCT_OFFSET (GskVulkanPushConstants, fragment),
+ .size = sizeof (((GskVulkanPushConstants *) 0)->fragment)
+ }
+ };
+
+ return ranges;
+}
--- /dev/null
+#ifndef __GSK_VULKAN_PUSH_CONSTANTS_PRIVATE_H__
+#define __GSK_VULKAN_PUSH_CONSTANTS_PRIVATE_H__
+
+#include <gdk/gdk.h>
+#include <graphene.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GskVulkanPushConstants GskVulkanPushConstants;
+
+struct _GskVulkanPushConstants
+{
+ struct {
+ float mvp[16];
+ } vertex;
+ struct {
+ float color[4];
+ } fragment;
+};
+
+const VkPushConstantRange *
+ gst_vulkan_push_constants_get_ranges (void) G_GNUC_PURE;
+uint32_t gst_vulkan_push_constants_get_range_count (void) G_GNUC_PURE;
+
+void gsk_vulkan_push_constants_init (GskVulkanPushConstants *constants,
+ const graphene_matrix_t *mvp);
+void gsk_vulkan_push_constants_init_copy (GskVulkanPushConstants *self,
+ const GskVulkanPushConstants *src);
+
+void gsk_vulkan_push_constants_set_mvp (GskVulkanPushConstants *self,
+ const graphene_matrix_t *mvp);
+void gsk_vulkan_push_constants_multiply_mvp (GskVulkanPushConstants *self,
+ const graphene_matrix_t *transform);
+void gsk_vulkan_push_constants_set_color (GskVulkanPushConstants *self,
+ const GdkRGBA *color);
+
+void gsk_vulkan_push_constants_push_vertex (GskVulkanPushConstants *self,
+ VkCommandBuffer command_buffer,
+ VkPipelineLayout pipeline_layout);
+void gsk_vulkan_push_constants_push_fragment (GskVulkanPushConstants *self,
+ VkCommandBuffer command_buffer,
+ VkPipelineLayout pipeline_layout);
+
+G_END_DECLS
+
+#endif /* __GSK_VULKAN_PUSH_CONSTANTS_PRIVATE_H__ */
#include "gskvulkanimageprivate.h"
#include "gskrendernodeprivate.h"
#include "gskrenderer.h"
+#include "gskvulkanpushconstantsprivate.h"
#include "gskvulkanrendererprivate.h"
typedef struct _GskVulkanRenderOp GskVulkanRenderOp;
GSK_VULKAN_OP_FALLBACK,
GSK_VULKAN_OP_SURFACE,
GSK_VULKAN_OP_TEXTURE,
- GSK_VULKAN_OP_BIND_MVP
+ GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS,
+ GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS
} GskVulkanOpType;
struct _GskVulkanRenderOp
GskVulkanOpType type;
GskRenderNode *node; /* node that's the source of this op */
GskVulkanImage *source; /* source image to render */
- graphene_matrix_t mvp; /* new mvp to set */
+ GskVulkanPushConstants constants; /* new constants to push */
gsize vertex_offset; /* offset into vertex buffer */
gsize vertex_count; /* number of vertices */
gsize descriptor_set_index; /* index into descriptor sets array for the right descriptor set to bind */
}
void
-gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- const graphene_matrix_t *mvp,
- GskRenderNode *node)
+gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self,
+ GskVulkanRender *render,
+ const GskVulkanPushConstants *constants,
+ GskRenderNode *node)
{
GskVulkanRenderOp op = {
.type = GSK_VULKAN_OP_FALLBACK,
for (i = 0; i < gsk_container_node_get_n_children (node); i++)
{
- gsk_vulkan_render_pass_add_node (self, render, mvp, gsk_container_node_get_child (node, i));
+ gsk_vulkan_render_pass_add_node (self, render, constants, gsk_container_node_get_child (node, i));
}
}
break;
{
graphene_matrix_t transform;
- op.type = GSK_VULKAN_OP_BIND_MVP;
gsk_transform_node_get_transform (node, &transform);
- graphene_matrix_multiply (&transform, mvp, &op.mvp);
+ op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
+ gsk_vulkan_push_constants_init_copy (&op.constants, constants);
+ gsk_vulkan_push_constants_multiply_mvp (&op.constants, &transform);
g_array_append_val (self->render_ops, op);
- gsk_vulkan_render_pass_add_node (self, render, &op.mvp, gsk_transform_node_get_child (node));
- graphene_matrix_init_from_matrix (&op.mvp, mvp);
+ gsk_vulkan_render_pass_add_node (self, render, &op.constants, gsk_transform_node_get_child (node));
+ gsk_vulkan_push_constants_init_copy (&op.constants, constants);
g_array_append_val (self->render_ops, op);
}
break;
const graphene_matrix_t *mvp,
GskRenderNode *node)
{
- GskVulkanRenderOp op = {
- .type = GSK_VULKAN_OP_BIND_MVP,
- .mvp = *mvp
- };
+ GskVulkanRenderOp op = { 0, };
+ op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
+ gsk_vulkan_push_constants_init (&op.constants, mvp);
g_array_append_val (self->render_ops, op);
- gsk_vulkan_render_pass_add_node (self, render, mvp, node);
+ op.type = GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS;
+ g_array_append_val (self->render_ops, op);
+
+ gsk_vulkan_render_pass_add_node (self, render, &op.constants, node);
}
static void
default:
g_assert_not_reached ();
- case GSK_VULKAN_OP_BIND_MVP:
+ case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
+ case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
break;
}
}
default:
g_assert_not_reached ();
- case GSK_VULKAN_OP_BIND_MVP:
+ case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
+ case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
op->vertex_offset = 0;
op->vertex_count = 0;
break;
default:
g_assert_not_reached ();
- case GSK_VULKAN_OP_BIND_MVP:
+ case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
+ case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
break;
}
}
VkCommandBuffer command_buffer)
{
GskVulkanRenderOp *op;
- float float_matrix[16];
guint i;
for (i = 0; i < self->render_ops->len; i++)
op->vertex_offset, 0);
break;
- case GSK_VULKAN_OP_BIND_MVP:
- graphene_matrix_to_float (&op->mvp, float_matrix);
- vkCmdPushConstants (command_buffer,
- gsk_vulkan_pipeline_get_pipeline_layout (pipeline),
- VK_SHADER_STAGE_VERTEX_BIT,
- 0,
- sizeof (float_matrix),
- &float_matrix);
+ case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
+ gsk_vulkan_push_constants_push_vertex (&op->constants,
+ command_buffer,
+ gsk_vulkan_pipeline_get_pipeline_layout (pipeline));
+ break;
+ case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
+ gsk_vulkan_push_constants_push_fragment (&op->constants,
+ command_buffer,
+ gsk_vulkan_pipeline_get_pipeline_layout (pipeline));
break;
default: